package com.tank;

import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.List;

/**
 * Description: 启动类,创建一个窗口
 *
 * @author vip Date：2018年9月11日
 */
public class TankClient extends Frame {
    private static final long serialVersionUID = 1L;
    /**
     * 我方坦克
     */
    Tank tank = new Tank(50, 50, this, true);
    /**
     * 敌方坦克
     */
    List<Tank> badTanks = new ArrayList<>();
    /**
     * 炮弹
     */
    List<Missile> missiles = new ArrayList<Missile>();
    /**
     * 爆炸
     */
    List<Boom> booms = new ArrayList<>();
    /**
     * 墙1
     */
    Wall wall01 = new Wall(100, 100, 300, 50);

    /**
     * 设置窗口
     */
    private void drawFrame() {
        //显示敌方坦克
        for (int i = 1; i <= 20; i++) {
            Tank t = new Tank(50 * i + 20, 500, this, false);
            badTanks.add(t);
        }
        // 初始化窗口位置
        this.setLocation(200, 100);
        // 初始化窗口大小
        this.setSize(1000, 600);
        // 禁止窗口缩放
        this.setResizable(false);
        // 设置窗口关闭事件
        this.addWindowListener(new WindowAdapter() {
            @Override
            //当点击X号时,退出程序
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        //设置背景颜色
        this.setBackground(Color.GREEN);
        // 设置窗口为显示
        this.setVisible(true);
        //开启坦克移动线程
        new Thread(new PointThread()).start();
        //添加键盘监听器
        this.addKeyListener(new KeyMonitor());
    }

    /**
     * 画坦克
     *
     * @param g
     */
    @Override
    public void paint(Graphics g) {
        //布置墙
        wall01.drawWall(g);

        //画红方坦克
        tank.drowTank(g);
        //不允许与敌方坦克重叠
        tank.hitTanks(badTanks);

        //显示蓝方坦克
        for (int i = 0; i < badTanks.size(); i++) {
            //画蓝方坦克
            badTanks.get(i).drowTank(g);
            //友军坦克之间互不重叠
            badTanks.get(i).hitTanks(badTanks);
            //不与红方坦克不重叠
            badTanks.get(i).hitTank(tank);
            badTanks.get(i).hitWall(wall01);
        }
        //显示炮弹数据
        g.setColor(Color.BLACK);
        g.drawString("当前坦克发出炮弹: " + this.missiles.size(), 10, 40);

        //画炮弹
        for (int i = 0; i < missiles.size(); i++) {
            //我方炮弹打中敌方坦克
            missiles.get(i).hitTank(badTanks);
        }
        for (int i = 0; i < missiles.size(); i++) {
            //敌方炮弹打中我方坦克
            missiles.get(i).hitTank(tank);
            missiles.get(i).drowMissile(g);
        }
        for (int i = 0; i < missiles.size(); i++) {
            //敌方炮弹打中墙
            missiles.get(i).hitWall(wall01);
        }


        //画爆炸效果
        for (int i = 0; i < booms.size(); i++) {
            if (booms.size() > 0) {
                booms.get(i).drawBoom(g);
            }
        }
    }
    //背景图
    Image image = null;

    /**
     * 先画好背景图
     */
    @Override
    public void update(Graphics g) {
        if (image == null) {
            image = this.createImage(1000, 600);
        }
        Graphics graphics = image.getGraphics();
        //设置颜色
        graphics.setColor(Color.GREEN);
        //设置矩形位置和大小
        graphics.fillRect(0, 0, 1000, 600);
        paint(graphics);
        g.drawImage(image, 0, 0, null);
    }

    /**
     * Description:	线程,重画坦克,repaint会自动调用paint
     *
     * @author vip
     * Date：2018年9月11日
     */
    private class PointThread implements Runnable {
        @Override
        public void run() {
            while (true) {
                //repaint会自动调用paint()方法
                repaint();
                try {
                    //每50ms运行一次画坦克
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * Description:	键盘监听器
     *
     * @author vip
     * Date：2018年9月11日
     */
    private class KeyMonitor extends KeyAdapter {
        @Override
        public void keyPressed(KeyEvent e) {
            tank.keyPressed(e.getKeyCode());
        }

        @Override
        public void keyReleased(KeyEvent e) {
            tank.keyReleased(e.getKeyCode());
        }
    }

    public static void main(String[] args) {
        TankClient tc = new TankClient();
        tc.drawFrame();
    }
}

